創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2020年11月18日 星期三

在Ubuntu 20.04編譯小小輸入法

概要

在Ubuntu 20.04 MATE 64位元版使用小小輸入法已好一陣子了,但在Qt程式上無法正常輸入中文,系統中的Qt是5.12版,而小小輸入法官方並無提供此版的Qt輸入法插件,下載5.13版並無作用。

心想試著在這環境上自行從原始碼編譯小小輸入法與Qt 5.12版的輸入法插件,看能否改善以上問題。只編譯了64位元版,32位元版編譯失敗,而且新版的Ubuntu也不再出32位元版,就直接放生吧。編譯過程出現幾次錯誤,做了點調整後才完成。

以下是在Ubuntu 20.04 64位元版編譯小小輸入法的工作記錄,其他不同版本的Linux若要做此工作,可能要做些調整,請查閱最後面的參考與連結。原始的編譯說明[1]中有提到編譯工作所須幾個軟體的最低版本與條件,這裡不列,因當前環境在正常情形下,不至於搞到低於那些條件。

在後面會附上編譯完成的檔案。

整備編譯環境

準備好工作用的機器灌好Ubuntu 20.04 64位元,更新到最新版本;或者也可以在虛擬機中做此工作。

編譯工作須要用到一些工具、編譯器與開發環境的包(package,或稱套件),以下為方便說明,分成幾段安裝。確定已安裝好的部分,可自行略過。

先裝幾個工具與編譯器的包:


$ sudo apt install build-essential git curl

安裝好相關的開發環境:


$ sudo apt install libgtk-3-dev libgtk2.0-dev libxkbcommon-dev libibus-1.0-dev libc6-dev-amd64

編譯Qt 5模塊(即Qt輸入法插件)要用到Qt 5開發環境:


$ sudo apt install qtbase5-dev qtbase5-private-dev

如果忘了安裝前述的Qt 5開發環境,編譯時會出現這樣的錯誤:


Package Qt5Gui was not found in the pkg-config search path.
Perhaps you should add the directory containing `Qt5Gui.pc'
to the PKG_CONFIG_PATH environment variable
No package 'Qt5Gui' found
child_process.js:655
    throw err;
    ^

Error: Command failed: pkg-config --modversion Qt5Gui
Package Qt5Gui was not found in the pkg-config search path.
Perhaps you should add the directory containing `Qt5Gui.pc'
to the PKG_CONFIG_PATH environment variable
No package 'Qt5Gui' found

編譯工作所用的腳本以JavaScript撰寫,故須要有Node.js來執行它們。有幾種不同的安裝方式,這裡採用LTS版本[3]:


$ curl -sL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
$ sudo apt-get install -y nodejs

下載原始碼

Linux版的原始碼自2018年至今一直沒更新,仍是2.5版,本文使用此版本。以下在自己的家目錄建立一資料夾,以git取得原始碼存放其中;以wget取得編譯工作用的JavaScript腳本;然後自行建立原始碼目錄中幾個空的資料夾,因git不存空資料夾,由於不編譯32位元版,所以就不建立存放32位元二進制檔的空資料夾:


$ mkdir yong_src
$ cd yong_src
$ git clone https://github.com/dgod/yong.git
$ cd yong/
$ wget https://raw.githubusercontent.com/dgod/build.js/master/build.js
$ mkdir -p {llib,cloud,gbk,mb,vim}/l64
$ mkdir -p {im,config}/{l64-gtk3,l64-gtk2}
$ mkdir -p im/gtk-im/{l64-gtk3,l64-gtk2}
$ mkdir -p im/IMdkit/l64
$ mkdir -p im/qt5-im/l64-qt5

上述最後一行在編譯Qt 5模塊時會用到,若沒此目錄,編譯過程會出現像這樣的錯誤:


Failed change to directory '/home/fygul/yong_src/yong/im/qt5-im/l64-qt5'

只要自行把最後那個 l64-qt5 子目錄建立好,重新執行後述的編譯命令即可。

進行編譯工作

編譯腳本可用來編譯整個Linux版的小小輸入法二進制檔案;或只編譯Qt 5模塊;還可以把編譯好的二進制檔連同相關檔案打包成一壓縮檔。它還有其他作用,但不在本文談論範圍。

只編譯Qt 5模塊

若不想編譯整個輸入法,只想編譯Qt 5模塊,使用以下的命令(本文環境不必像參考[4], [5]調整 im/qt5-im/build.txt):


$ node build.js -C im/qt5-im

完成後,自行取得產出的檔案,並放到正確的位置使用[6],後述的打包工作並不包含此檔。以本文為例,它在:


/home/fygul/yong_src/yong/im/qt5-im/l64-qt5/libyongplatforminputcontextplugin.so

編譯Linux版小小輸入法

之前編譯32位元版本時出現這樣的錯誤:


/usr/bin/ld: 當搜尋用於 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a 時跳過不相容的 -lgcc
/usr/bin/ld: 找不到 -lgcc

基於前述的理由,懶得去解決它,就只使用以下命令來編譯64位元版本,同時也會編譯上述的Qt 5模塊:


$ node build.js l64

打包成7z壓縮檔

由於沒編譯32位元的版本,所以此處要做點調整,排除這部分,不然腳本執行打包程序時會出錯。

打開 yong/install/build.txt ,在第69行前加上釋註符號,使其失效而不複製32位元版的檔案:


//  copy_build("l32");

完成後存檔,執行:


$ node build.js -C install copy dist

腳本會調用7za做最終的打包工作,本文環境預裝p7zip-full,已包含此壓縮程式。打包完成的壓縮檔,以本文為例在:


/home/fygul/yong_src/yong/install/yong-lin-20201116.7z

結語

編譯出來的檔案大小相較官方版本的二進制檔而言感覺上是大了點,但整體上還不算太大,仍配得上小小二字。

在Kubuntu 20.04.1上安裝[7]並測試這回編譯的小小輸入法,在Qt 5程式Kate上可正常使用,如下圖:

附上編譯完成的檔案,把上述兩個輸出檔案,壓縮成一個7z檔,在此。SHA256校驗碼:84a939d2be037b3de1cbf1e56915e0e6cc1cc56221343136389b4f3f2937837c

參考與連結

  1. Yong输入法的编译方法
  2. Create README.md #5
  3. NodeSource Node.js Binary Distributions
  4. QT5.9 不再兼容低版本的插件
  5. QT5.9编译小小输入法插件
  6. Qt5桌面程式上使用小小輸入法
  7. Ubuntu 20.04無法選用小小輸入法的問題與解決

沒有留言:

張貼留言